using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Xna.Framework;

namespace XnaDevRu.Bullet
{
	public class Triangle
	{
		private Vector3 _vertexA;
		private Vector3 _vertexB;
		private Vector3 _vertexC;
		private int _partId;
		private int _triangleIndex;

		public Vector3 VertexA { get { return _vertexA; } set { _vertexA = value; } }
		public Vector3 VertexB { get { return _vertexB; } set { _vertexB = value; } }
		public Vector3 VertexC { get { return _vertexC; } set { _vertexC = value; } }
		public int PartId { get { return _partId; } set { _partId = value; } }
		public int TriangleIndex { get { return _triangleIndex; } set { _triangleIndex = value; } }
	}

	/// <summary>
	/// example usage of this class:
	///			TriangleBuffer triBuf;
	///			concaveShape.processAllTriangles(triBuf, out aabbMin, out aabbMax);
	///			for (int i = 0; i < triBuf.getNumTriangles(); i++)
	///			{
	///				Triangle tri = triBuf.getTriangle(i);
	///				//do something useful here with the triangle
	///			}
	/// </summary>
	public class TriangleBuffer : ITriangleCallback
	{
		private List<Triangle> _triangleBuffer = new List<Triangle>();

		public int TriangleCount { get { return _triangleBuffer.Count; } }
		public Triangle this[int index] { get { return _triangleBuffer[index]; } }

		public void ClearBuffer()
		{
			_triangleBuffer.Clear();
		}

		#region ITriangleCallback Members
		public void ProcessTriangle(Vector3[] triangle, int partID, int triangleIndex)
		{
			Triangle tri = new Triangle();
			tri.VertexA = triangle[0];
			tri.VertexB = triangle[1];
			tri.VertexC = triangle[2];
			tri.PartId = partID;
			tri.TriangleIndex = triangleIndex;

			_triangleBuffer.Add(tri);
		}
		#endregion
	}
}
